package com.lml.jdk8.test06;

import org.junit.jupiter.api.Test;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Stream;

/**
 * @author Administrator
 * @date 2020/2/29 11:13
 * Description:
 */
public class DemoTest {
    List<Student> list = Arrays.asList(
            new Student("lili", 19, 160.8),
            new Student("lili", 19, 160.8),
            new Student("feifei", 12, 170.8),
            new Student("lulu", 21, 160.8),
            new Student("nana", 17, 150.8),
            new Student("xiaoming", 20, 190.8)
    );

    @Test
    void fun12() {
        //按照学生年龄进行排序
        list.stream().
                sorted((x, y) -> x.getAge() - y.getAge()).
                forEach(System.out::println);
        //输出结果: 按照年龄升序 -> 12 17 19 19 20 21
    }

    @Test
    void fun11() {
        List<Integer> list = Arrays.asList(1, 4, 5, 6, 2, 8);
        list.stream().sorted().forEach(System.out::println);
        //输出结果: 1 2 4 5 6 8
    }

    @Test
    void fun10() {
        //获取年龄大于18岁的学生名字
        list.stream().
                filter(x -> x.getAge() >= 18).
                map(Student::getName).
                forEach(System.out::println);
    }

    @Test
    void fun9() {
        //将list集合中学生姓名提取出来
        list.stream().
                map(Student::getName).
                forEach(System.out::println);
    }

    @Test
    void fun8() {
        //创建一映射关系,实现将字符串中小写字母转换为大写
        List<String> list = Arrays.asList("aa", "bb", "cc");
        list.stream().
                map(String::toUpperCase).
                forEach(System.out::println);
        // AA BB CC
    }


    @Test
    void fun7() {
        //去重
        /**注意:自定义的类必须重写hashCode和equals方法,
         因为distinct实现的时候底层调用了这两个方法*/
        list.stream().
                distinct().
                forEach(System.out::println);
    }

    @Test
    void fun6() {
        //skip(Long n) 跳过前n条满足条件的记录
        list.stream().
                filter(x -> {
                    System.out.println("正在进行过滤..");
                    return x.getAge() >= 18;
                }).skip(2).
                forEach(System.out::println);
    }

    @Test
    void fun5() {
        //limit 方法 短路的,只要找到2个满足条件的,后面的迭代操作就不进行了
        list.stream().
                filter(x -> {
                    System.out.println("正在进行过滤..");
                    return x.getAge() >= 18;
                }).limit(2).
                forEach(System.out::println);
    }

    @Test
    void fun4() {
        //刚才利用StreamAPI进行的迭代, ---> 内部迭代
        //以前写的是外部迭代: ---> 自己写
        Iterator<Student> it = list.iterator();
        while (it.hasNext()) {
            Student next = it.next();
            if (next.getAge() >= 18) {
                System.out.println(next);
            }
        }
    }

    @Test
    void fun3() {
        //感受:流水线式的链式操作
        list.stream().
                filter(x -> {
                    System.out.println("正在进行过滤...");
                    return x.getAge() >= 18;
                }).forEach(System.out::println);
    }

    @Test
    void fun2() {
        //1.创建Stream
        Stream<Student> s = list.stream();
        //2.中间操作
        Stream<Student> s2 = s.filter(x -> {
            System.out.println("正在进行过滤...");
            return x.getAge() >= 18;
        });
        //3.终止操作
        s2.forEach(System.out::println);
        //注意:如果只执行1,2造作,不会有任何结果.
        //验证出:Stream操作是延迟的,只有进行了终止操作,才会执行中间操作
        //我们叫"延迟加载或"惰性求值"
    }

    @Test
    void fun1() {
        //1.创建Stream
        Stream<Student> s = list.stream();
        //2.中间操作
        Stream<Student> s2 = s.filter(x -> x.getAge() >= 18);
        //3.终止操作
        s2.forEach(System.out::println);
    }

}
